#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>

#define TASK_NUM 10
// const char *err_string[]={
//     "success",
//     "error"
// };
// int add_to_top(int top)
// {
//     int sum = 0;
//     int i=0;
//     for (i = 0; i < top; i++)
//     {
//         sum += i;
//     }
//     return sum;
// }

// 预设一批任务
void sync_disk()
{
    printf("这是一个刷新数据的任务\n");
}

void sync_log()
{
    printf("这是一个同步日志的任务\n");
}

void sync_send()
{
    printf("这是一个进行网络发送的任务\n");
}

typedef void (*func_t)();
func_t other_task[TASK_NUM] = {NULL};

int LoadTask(func_t func)
{
    int i = 0;
    for (; i < TASK_NUM; i++)
    {
        if (other_task[i] == NULL)
            break;
    }
    if (i == TASK_NUM)
        return -1;
    else
        other_task[i] = func;
    return 0;
}

void InitTask()
{
    int i = 0;
    for (i = 0; i < TASK_NUM; i++)
    {
        other_task[i] = NULL;
    }
    LoadTask(sync_disk);
    LoadTask(sync_log);
    LoadTask(sync_send);
}

void RunTask()
{
    int i = 0;
    for (i = 0; i < TASK_NUM; i++)
    {
        if (other_task[i] == NULL)
            continue;
        other_task[i]();
    }
}

int main()
{
    pid_t id = fork();
    if (id == 0)
    {
        int cnt = 5;
        while (cnt)
        {
            printf("我是子进程\n");
            cnt--;
            sleep(1);
        }
        if (1 == 1)
            exit(0);
        exit(111);
    }

    InitTask();
    // pid_t ret_id = wait(NULL);
    while (1)
    {
        int status = 0;
        // pid_t ret_id = waitpid(id,&status,0);
        pid_t ret_id = waitpid(id, &status, WNOHANG);
        if (ret_id < 0)
        {
            printf("error\n");
            exit(1);
        }
        else if (ret_id == 0)
        {
            // printf("子进程还没退出\n");
            RunTask();
            sleep(1);
            continue;
        }
        else
        {
            if (WIFEXITED(status))
            {
                printf("wait success child exit code: %d\n", WEXITSTATUS(status));
            }
            else
            {
                printf("wait success child exit siginal: %d\n", status & 0x7F);
            }
            // printf("我是父进程，等待子进程成功,pid: %d, ppid: %d, ret_id: %d, status: %d, child exit code: %d, child exit siginal: %d\n",
            //    getpid(), getppid(), ret_id, status, (status >> 8) & 0xFF, status & 0x7F);
            break;
        }
    }
    // int i=0;
    // for(i=0;i<=200;i++)
    // {
    //     printf("%d : %s\n",i,strerror(i));
    // }
    // int result = add_to_top(100);
    // if (result == 5050)
    //     return 0;
    // else
    //     return 1;
}
